
package data;

import java.sql.*;
import java.io.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Alejandro
 */
public class BitacoraDataMapper {
    private Connection conexion;
    
    public BitacoraDataMapper(){
        Conector conector = new Conector();
        conexion = conector.darConexion();
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            stmt.execute("use be");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public boolean verificarCedulaProf(String cedula){
        boolean existe = false;
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            ResultSet rs = stmt.executeQuery("Select * from Profesor where cedula = \'"+cedula+"\'");
            if(rs.next()) existe = true;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return existe;
    }
    
    public ResultSet obtenerBitacorasProfesor(String cedula){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select b.codigoBitacora, c.nombre, b.numgrupo from Bitacora b, Profesor p, Curso c where p.cedula = \'"+cedula+"\' and  c.sigla = b.siglaCurso and b.cedulaProfesor = \'"+cedula+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public boolean verificarIDBitacora(String ID){
        boolean existe = false;
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            ResultSet rs = stmt.executeQuery("Select * from Bitacora where codigoBitacora = \'"+ID+"\'");
            if(rs.next()) existe = true;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return existe;
    }
    
    public ResultSet obtenerListaClase(String BitID){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select l.carnet, l.nombre, l.primerApellido, l.segundoApellido from Estudiantes l, ListaClase p, Bitacora b where p.carnet = l.carnet and p.codigoBitacora = b.codigoBitacora and b.codigoBitacora = \'"+BitID+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public ResultSet obtenerCartaEstudiante(String BitID){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select siglaCurso, oficina, consulta, contenidos, objetivos, metodologia, evaluacion, bibliografia, cronograma from CartaEstudiante where codigoBitacora = \""+BitID+"\"");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public void actualizarCartaEstudiante(String codigoBitacora,String oficina,String consulta,String contenidos,String objetivos,String evaluacion,String metodologia,String bibliografia,String cronograma){
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            stmt.executeUpdate("Update CartaEstudiante Set oficina= \'"+oficina+"\',consulta= \'"+consulta+"\',contenidos= \'"+contenidos+"\',objetivos= \'"+objetivos+"\',evaluacion= \'"+evaluacion+"\',metodologia= \'"+metodologia+"\',bibliografia= \'"+bibliografia+"\',cronograma= \'"+cronograma+"\' Where codigoBitacora = \'"+codigoBitacora+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public ResultSet obtenerReporte(String BitID){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select reporteFinal from Bitacora where codigoBitacora = \""+BitID+"\"");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public void actualizarReporte(String BitID, String reporte){
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            stmt.executeUpdate("Update Bitacora Set reporteFinal = \'"+reporte+"\' Where codigoBitacora = \'"+BitID+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public ResultSet obtenerDatosProfesor(String cedProf){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select p.nombre,p.nacionalidad,p.telefono,p.direccion,f.nombreTitulo from Profesor p, FormacionAcademicaProfesor f where p.cedula = \""+cedProf+"\"");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public ResultSet obtenerMPResultados(String BitID){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select r.nombreEntrega,r.mejorResultado,r.peorResultado from Resultados r where r.codigoBitacora = \""+BitID+"\"");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public int obtenerNumeroEntregas(){
        int total = 0;
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select * from Entregas");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        try {
            while(rs.next()){
                total++;
            }
        } catch (SQLException ex) {
            Logger.getLogger(BitacoraDataMapper.class.getName()).log(Level.SEVERE, null, ex);
        }
        return total;
    }
    
    public void agregarEntrega(String codigo, String nombre, String fecha, String nota, String porcentaje, String comentario, String codBit){
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            stmt.execute("insert into Entregas (codigo,nombreEntrega,fechaEntrega,codigoBitacora,comentariosRevision,nota,porcentajeObtenido) values (\'"+codigo+"\',\'"+nombre+"\',\'"+fecha+"\',\'"+codBit+"\',\'"+comentario+"\',"+nota+","+porcentaje+")");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public void agregarArchivo(String nombre, String tipo, String codigo, InputStream archivo){
        PreparedStatement ps;
        try {
            ps = conexion.prepareStatement("insert into Archivo_Examen (nombreArchivo,tipoArchivo,codigoEntrega,contenido) values (\'"+nombre+"\',\'"+tipo+"\',\'"+codigo+"\',?)");
            ps.setBinaryStream(1, archivo, archivo.available());
            ps.execute();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public void agregarIntegranteEntrega(String integrante, String codigo){
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            stmt.execute("insert into IntegrantesEntrega (codigoEntrega,carnet) values (\'"+codigo+"\',\'"+integrante+"\')");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public ResultSet obtenerArchivo(String codigoEntrega){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select * from Archivo_Examen where codigoEntrega = \'"+codigoEntrega+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public ResultSet obtenerMPResultado(String codBit, String nombreEntrega){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select * from Resultados where nombreEntrega = \'"+nombreEntrega+"\' and codigoBitacora = \'"+codBit+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public void actualizarMejorResultado(String codBit, String nombreEntrega, String codigoEntrega, int resultado){
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            stmt.executeUpdate("Update Resultados Set codigoMEntrega = \'"+codigoEntrega+"\', mejorResultado = "+resultado+" Where codigoBitacora = \'"+codBit+"\' and nombreEntrega = \'"+nombreEntrega+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public void actualizarPeorResultado(String codBit, String nombreEntrega, String codigoEntrega, int resultado){
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            stmt.executeUpdate("Update Resultados Set codigoPEntrega = \'"+codigoEntrega+"\', peorResultado = "+resultado+" Where codigoBitacora = \'"+codBit+"\' and nombreEntrega = \'"+nombreEntrega+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public void agregarMPResultado(String codBit, String nombreEntrega, String codigoMEntrega, int mejorResultado, String codigoPEntrega, int peorResultado){
        Statement stmt;
        try {
            stmt = conexion.createStatement();
            stmt.execute("insert into Resultados (codigoBitacora,nombreEntrega,codigoMEntrega,mejorResultado,codigoPEntrega,peorResultado) values (\'"+codBit+"\',\'"+nombreEntrega+"\',\'"+codigoMEntrega+"\',"+mejorResultado+",\'"+codigoPEntrega+"\',"+peorResultado+")");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    public int obtenerNotaFinal(String codBit, String carnet){
        int nota = 0;
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select e.porcentajeObtenido from Entregas e, IntegrantesEntrega i where i.carnet = \'"+carnet+"\' and e.codigoBitacora = \'"+codBit+"\' and e.codigo = i.codigoEntrega");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        try {
            while(rs.next()){
                nota += rs.getInt(1);
            }
        } catch (SQLException ex) {
            Logger.getLogger(BitacoraDataMapper.class.getName()).log(Level.SEVERE, null, ex);
        }
        return nota;
    }
    
    public ResultSet obtenerListadoEntregas(String codBit){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select e.codigo,e.nombreEntrega,e.fechaEntrega,e.nota,e.comentariosRevision,a.nombreArchivo from Entregas e, Archivo_Examen a where e.codigoBitacora = \'"+codBit+"\' and e.codigo = a.codigoEntrega");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
    
    public String obtenerStringIntegrantes(String codigoEntrega){
        String integrantes = "";
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select carnet from IntegrantesEntrega where codigoEntrega = \'"+codigoEntrega+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        try {
            if(rs.next()) integrantes += rs.getString(1);
            while(rs.next()){
                integrantes = integrantes + ", " + rs.getString(1);
            }
        } catch (SQLException ex) {
            Logger.getLogger(BitacoraDataMapper.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return integrantes;
    }
    
    public ResultSet obtenerCodigosEntrega(String codBit){
        Statement stmt;
        ResultSet rs = null;
        try {
            stmt = conexion.createStatement();
            rs = stmt.executeQuery("Select codigo from Entregas where codigoBitacora = \'"+codBit+"\'");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        
        return rs;
    }
}
